﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Intelsi.Entity;
using Microsoft.Practices.Unity;

namespace Intelsi.DataAcces
{
    public class ProveedorDAO: MasterDataAccess , IProveedorDAO
    {
        [Dependency]
        public IDetalleProveedorDAO detalleProveedorDAO { get; set; }

        public List<Proveedor> GetAllFromProveedor()
        {
            var query = from p in Context.Proveedors
                        orderby p.IdProvedor
                        select p;

            return query.ToList();
        }

        public List<Proveedor> GetAllFromProveedorByCriterio(string criterio)
        {
            var query = from p in Context.Proveedors
                        select p;

            if (criterio != null)
            {
                query = query.Where(p => p.RazonSocial.ToUpper().StartsWith(criterio.ToUpper()) ||
                                        p.RazonSocial.ToUpper().Contains(criterio.ToUpper()) 

                    );

            }

            return query.OrderBy(p => p.IdProvedor).ToList();
        }

        public ProveedorDTO GetAllFromProveedorById(int IdProveedor)
        {
            var query = from pv in Context.Proveedors
                        where (pv.IdProvedor.Equals(IdProveedor))
                        join pr in Context.Proveedors on pv.IdProvedor equals pr.IdProvedor

                        select new ProveedorDTO
                        {
       
                            IdProvedor= pv.IdProvedor,
                            Ruc = pv.Ruc,
                            RazonSocial = pv.RazonSocial,
                            Email = pv.Email,
                            IdUbigeo = pv.IdUbigeo,
                            Distrito = pv.ubigeo.distrito,
                            Provincia = pv.ubigeo.provincia,
                            Departamento = pv.ubigeo.departamento,
                            Direccion = pv.Direccion,
                            TelefonoEmpr = pv.TelefonoEmpr,
                            NombreContacto = pv.NombreContacto,
                            DNIContacto = pv.DNIContacto,
                            TelefonoCont = pv.TelefonoCont,
                            TelefonoContII = pv.TelefonoContII,

                           
                        };
                    var proveedor = query.SingleOrDefault();
                          if (proveedor != null)
                               {
                                   proveedor.DetalleProvedor = detalleProveedorDAO.GetFromDetalleProveedorByProveedorid(IdProveedor);
                                
                              }
                    return proveedor;
        }

        public void AddProveedor(ProveedorDTO proveedor)
        { 
            
            Proveedor proveedorNuevo = new Proveedor();

            var existe = (from p in Context.Proveedors
                              where p.IdProvedor.Equals(proveedor.IdProvedor)
                              select p).SingleOrDefault();

            if (existe != null)
            {
                existe.Ruc = proveedor.Ruc;
                existe.RazonSocial = proveedor.RazonSocial;
                existe.IdUbigeo = proveedor.IdUbigeo;
                existe.Email = proveedor.Email;
                existe.TelefonoEmpr = proveedor.TelefonoEmpr;
                existe.Direccion = proveedor.Direccion;
                existe.NombreContacto = proveedor.NombreContacto;
                existe.DNIContacto = proveedor.DNIContacto;
                existe.TelefonoCont = proveedor.TelefonoCont;
                existe.TelefonoContII = proveedor.TelefonoContII;

                foreach (var idProv in proveedor.DetalleProvedor)
                {
                    var detalleExiste = (from dp in existe.BancoProvedors
                                                where dp.IdBanco.Equals(idProv.IdBanco)
                                                select dp).SingleOrDefault();

                    if (detalleExiste != null)
                    {

                        var detalle = new BancoProvedor();
                        detalle.LineaCredito = idProv.LineaCredito;
                        detalle.NumeroCuenta = idProv.NumeroCuenta;
                        Context.Entry(existe).State = System.Data.EntityState.Modified;
                    }
                    else
                    {
                        var detalle = new BancoProvedor();

                        detalle.IdProveedor = idProv.IdProveedor;
                        detalle.IdBanco = idProv.IdBanco;
                        detalle.TipodeCuenta = idProv.TipodeCuenta;
                        detalle.TipoPago = idProv.TipoPago;
                        detalle.LineaCredito = idProv.LineaCredito;
                        detalle.NumeroCuenta = idProv.NumeroCuenta;
                        existe.BancoProvedors.Add(detalle);
                    }

                }

                Context.Entry(existe).State = System.Data.EntityState.Modified;
                Context.SaveChanges();


            }
            else
            {

                proveedorNuevo.Ruc = proveedor.Ruc;
                proveedorNuevo.RazonSocial = proveedor.RazonSocial;
                proveedorNuevo.IdUbigeo = proveedor.IdUbigeo;
                proveedorNuevo.Email = proveedor.Email;
                proveedorNuevo.TelefonoEmpr = proveedor.TelefonoEmpr;
                proveedorNuevo.Direccion = proveedor.Direccion;
                proveedorNuevo.NombreContacto = proveedor.NombreContacto;
                proveedorNuevo.DNIContacto = proveedor.DNIContacto;
                proveedorNuevo.TelefonoCont = proveedor.TelefonoCont;
                proveedorNuevo.TelefonoContII = proveedor.TelefonoContII;

                foreach (var idProv in proveedor.DetalleProvedor)
                {
                    var detalle = new BancoProvedor();

                    detalle.IdProveedor = idProv.IdProveedor;
                    detalle.IdBanco = idProv.IdBanco;
                    detalle.TipodeCuenta = idProv.TipodeCuenta;
                    detalle.TipoPago = idProv.TipoPago;
                    detalle.LineaCredito = idProv.LineaCredito;
                    detalle.NumeroCuenta = idProv.NumeroCuenta;

                    proveedorNuevo.BancoProvedors.Add(detalle);

                }

                Context.Proveedors.Add(proveedorNuevo);
                Context.SaveChanges();
            }

                           
        }

        //public void ActualizarProveedor(Proveedor proveedor)
        //{

        //    var existe = (from p in Context.Proveedors
        //                  where p.IdProvedor == proveedor.IdProvedor
        //                  select p).SingleOrDefault();
        //    if (existe != null)
        //    {
        //        existe.Ruc = proveedor.Ruc;
        //        existe.RazonSocial = proveedor.RazonSocial;
        //        existe.TelefonoEmpr = proveedor.TelefonoEmpr;
        //        existe.Email = proveedor.Email;
        //        existe.Direccion = proveedor.Direccion;
        //        existe.NombreContacto = proveedor.NombreContacto;
        //        existe.DNIContacto = proveedor.DNIContacto;
        //        existe.TelefonoCont = proveedor.TelefonoCont;
        //        existe.TelefonoContII = proveedor.TelefonoContII;
                

        //        Context.Entry(existe).State = System.Data.EntityState.Modified;
        //        Context.SaveChanges();
        //    }
            
        //}
    }
}
